package main.java.interfaces;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;

import main.java.fases.Blitzkrieg;
import main.java.fases.DefensaAliada;
import main.java.fases.LogisticaAlemana;
import main.java.fases.PlanificacionAlemana;
import main.java.juego.Baraja;
import main.java.juego.Turno;
import main.java.tipos.CartaAlemania;
import main.java.tipos.*;
import main.java.fases.*;
import main.java.juego.*;

public class InterfazConsola implements InterfazUsuario{
	private Baraja partida;
	public InterfazConsola(Baraja par){
		partida=par;
	}
	
	public InterfazConsola(){
		partida=null;
	}
	
	public void ejecutarFase1(DefensaAliada defensa){
		if (defensa.getTurnoActual().dameNumeroDeTurnos() == 1)
		{
			informar("FALL OF FRANCE: Comienza la batalla");
		}
		informar("\nTURNO "+String.valueOf(defensa.getTurnoActual().dameNumeroDeTurnos()));
		mostrarListaDecartas("Cartas aliadas", defensa.getCartasAliados());
	}
	
	public void ejecutarFase2(LogisticaAlemana logistica){
		mostrarListaDecartas("Cartas alemanas",logistica.getCartasAlemanas());
		List<CartaAlemania> cartasDeLiderazgo = logistica.getCartasDeLiderazgo();
		boolean seguir=true;
		int descarte=0;
		if(cartasDeLiderazgo.size()!=0){
			if(partida.getCartasAlemanasRestantes()<2){
				informar("Hay cartas de liderazgo pero no hay suficientes cartas en el mazo\n");
			}else{
				mostrarListaDecartas("Cartas de liderazgo",cartasDeLiderazgo);
				seguir=preguntar("\n¿Quiere descartarse de alguna carta de Liderazgo?");
				if(seguir){
					while(cartasDeLiderazgo.size()!=0 && seguir && partida.getCartasAlemanasRestantes()>2){
						descarte = pideDescartes(cartasDeLiderazgo.size());
						logistica.reemplazaCartasLiderazgo(cartasDeLiderazgo.get(descarte-1));
						if(cartasDeLiderazgo.size()!=0){
							if(partida.getCartasAlemanasRestantes()<2){
								informar("No puede reeemplazar más cartas de liderazgo porque no hay suficientes cartas en el mazo\n");
							}else{
								mostrarListaDecartas("Cartas de liderazgo",cartasDeLiderazgo);
								seguir=preguntar("\n¿Quiere descartarse de alguna carta de Liderazgo?");

							}
						}else{
							informar("\nYA NO HAY MAS CARTAS DE LIDERAZGO");
						}
					}	
			}
			}
			mostrarListaDecartas("Cartas alemanas",logistica.getCartasAlemanas());
		}
	}
	
	public void ejecutarFase3(PlanificacionAlemana planificacion) {
		boolean seguir=true;
		int descarte=0;
		int numeroDescartes=0;
		seguir=preguntar("\n¿Quiere descartarse de alguna carta de Alemania?");
		if(seguir){
			while(numeroDescartes<4 && seguir){
				descarte = pideDescartes(planificacion.getCartasAlemanas().size());
				planificacion.descartaAlemana(planificacion.getCartasAlemanas().get(descarte-1));
				mostrarListaDecartas("Cartas alemanas",planificacion.getCartasAlemanas());
				numeroDescartes++;
				if(numeroDescartes==4 || partida.mazoAlemanVacio()){
					informar("\nYA NO PUEDE DESCARTARSE DE MAS CARTAS");
					seguir=false;
				}else{
					seguir=preguntar("\n¿Quiere descartarse de alguna carta de Alemania?");
				}
			}
		}
	}

	public void ejecutarFase4(Blitzkrieg faseFinal) {
		Turno turnoActual = faseFinal.getTurnoActual();
		if(faseFinal.hayCombinacion(faseFinal.getCartasAlemanas())){
			informar("\nHAY COMBINACIÓN");
			gestionarCombinacion(faseFinal);
			if(faseFinal.batallaganada()){
				informar("\nBATALLA GANADA!!");
				informar("\n=============================================");
				// InterfazUsuario.informaBatallaGanada();
			}else{
				turnoActual.anadeRetrasoPartida();
				informar("\nCOMBINACIÓN INSUFICIENTE");
			}
		}else{
			//Añadir retraso vuelve a insertar de nuevo las cartas aliadas
			turnoActual.anadeRetrasoPartida();
			informar("\nNO HAY POSIBILIDAD DE COMBINACIÓN");
			informar("\n=============================================");
		}	
	}
	
	private void gestionarCombinacion(Blitzkrieg faseFinal){
		Turno turnoActual = faseFinal.getTurnoActual();
		while(faseFinal.getCartasAlemanas().size()>5 ){
			mostrarListaDecartas("CARTAS ALEMANAS",faseFinal.getCartasAlemanas());
			informar("\nFORMA LA COMBINACION, DESCARTA CARTAS HASTA TENERLA");
			int descarte=pideDescartes(faseFinal.getCartasAlemanas().size());
			CartaAlemania carta = turnoActual.dameCartaPorIndice(descarte-1);
			turnoActual.descartarCartaAlemana(carta);
			if(!faseFinal.hayCombinacion(turnoActual.dameCartasAlemanasEnJuego())){
				informar("\nVUELVA A SELECCIONAR CARTA, SI ELIMINA ESA CARTA DEJA DE HABER COMBINACION");
				turnoActual.dameCartasAlemanasEnJuego().add(descarte-1, carta);
			}
			
		}
		
	    faseFinal.setCombinacion(turnoActual.dameCartasAlemanasEnJuego());
	}
	
	public void mostrarListaDecartas(String encabezado, List<?> lista){
		int limite = lista.size();
		int numeroCarta=0;
		System.out.println("\n"+encabezado.toUpperCase());
		for(int i=0;i<limite;i++){
			numeroCarta=i+1;
			System.out.println("Carta "+ numeroCarta+ ": "+lista.get(i));
		}
	}
	
	public void devuelveResultadoPartida(){
		String resultado="";
		if(partida.dameRetrasos()>=7){
			resultado = "Ha perdido la guerra: ha acumulado 7 contadores de retraso";
		}
		else if(partida.mazoAlemanVacio()){
			resultado = "Ha perdido la guerra: ha agotado sus cartas";
		}else{
			resultado = "Ha ganado la guerra: ha terminado con todas las cartas aliadas";
		}
		System.out.println("\n"+resultado);
	}
	
	public int pideDescartes(int numeroMaximo){
		int descarte=0;
		String linea;
		System.out.println("\n¿De qué carta quiere descartarse?");
		try{
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			linea = br.readLine();
			descarte = dameValorEnteroCorrecto(linea, numeroMaximo);
			while(descarte==-1){
				System.out.println("\nIndice de carta incorrecto indique de nuevo de qué carta quiere descartarse:");
				br = new BufferedReader(new InputStreamReader(System.in));
				linea = br.readLine();
				descarte = dameValorEnteroCorrecto(linea, numeroMaximo);
			}
			
		}catch(Exception e){
			throw new IllegalArgumentException("No es un entero");
		}	
		return descarte;
	}
	
	//Devuelve la cadena convertida a entero o -1 en caso de error
	private Integer dameValorEnteroCorrecto(String s,int numeroMaximo){
		Integer valor=-1;
			for(int i=1;i<=numeroMaximo;i++){
				if(s.equals(Integer.toString(i))){
					valor=Integer.parseInt(s);
					break;
				}
			}
		return valor;
	}
	
	public boolean preguntar(String pregunta){
		boolean decision=false;
		System.out.println(pregunta + " [s/n]:");
		try{
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			String linea = br.readLine();
			while (!linea.equals("s") && !linea.equals("n") && !linea.equals("\n")){
				System.out.println(pregunta + " [s/n]:");
				br = new BufferedReader(new InputStreamReader(System.in));
				linea = br.readLine();
			}
			if(linea.equals("s")){
				decision=true;
			}
		}catch(Exception e){
			
		}	
		return decision;
	}
	
	public void informar(String cadena){
		System.out.println(cadena);
	}


	@Override
	public void setPartida(Baraja b) {
		partida=b;
		
	}
}
